<?php

/**
 * Store_CartController
 *
 * Модуль магазина, контроллер корзины
 *
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Store_CartController extends Lord_Controller_Action
{

/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод. Отображает список товаров в корзине
	 */

	public function indexAction()
	{
        // проверяем, есть ли нужные куки
        $cookie = (isset($_COOKIE['Profit_Cart']))
                ? array_merge($_COOKIE['Profit_Cart'])
                : array();

        if($cookie != null)
        {
            // желаемые товары и их картинки
            $cartImages = array();
            $cart = ($cookie != null)
                     ? $this->model->getSomeGoods($cookie)
                     : array();
            $cartImagesData = $this->model->getImages($cart)->toArray();
            foreach($cartImagesData as $image)
            {
                $cartImages[$image['gid']] = $image['file'];
            }
            // посчитаем сколько товаров на сколько денег  в корзине
            $sum = 0;
            $count = 0;
            foreach($cart as $good)
            {
                $sum = $sum + $good->price;
                $count = $count + 1;
            }

            // назначаем в шаблон вида
            $this->view->sum        = $sum;;
            $this->view->count      = $count;
            $this->view->cart       = $cart;
            $this->view->cartImages = $cartImages;
        }

        Zend_Layout::getMvcInstance()->disableLayout();

        return ;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление товара в корзину
	*/

	public function addAction()
	{
        $cookie = array();
        // смотрим айдишник товара
        $id = $this->_checkId();
        if($id != 0)
        {
            // устанавливаем куку с этим айдишником
            $ok = setcookie('Profit_Cart['.$id.']',       // имя куки
                            $id,                          // значение
                            time()+60*60*24*30,           // срок хранения
                            '/',                          // путь на сервере
                            '.' . $_SERVER['SERVER_NAME'] // имя сервера
                            );
            // куки ставятся после завершения скрипта, а нам нужно сейчас,
            // потому как аякс не ждет. Сделаем небольшую хитрость:
            $cookie[$id] = $id;
        }

        // проверяем, есть ли нужные куки
        if(isset($_COOKIE['Profit_Cart']))
            $cookie = array_merge($_COOKIE['Profit_Cart'], $cookie);

        if($cookie != null)
        {
            // желаемые товары и их картинки
            $cartImages = array();
            $cart = ($cookie != null)
                     ? $this->model->getSomeGoods($cookie)
                     : array();
            $cartImagesData = $this->model->getImages($cart)->toArray();
            foreach($cartImagesData as $image)
            {
                $cartImages[$image['gid']] = $image['file'];
            }
            // посчитаем сколько товаров на сколько денег  в корзине
            $sum = 0;
            $count = 0;
            foreach($cart as $good)
            {
                $sum = $sum + $good->price;
                $count = $count + 1;
            }

            // назначаем в шаблон вида
            $this->view->sum        = $sum;
            $this->view->count      = $count;
            $this->view->cart       = $cart;
            $this->view->cartImages = $cartImages;
        }

        Zend_Layout::getMvcInstance()->disableLayout();

        return ;
	}


/*------------------------------------------------------------------------------*/

	/**
	* Удаление товара из списка пожеланий
	*/

	function deleteAction()
	{
        // смотрим айдишник товара
        $id = $this->_checkId();

        // устанавливаем куку с этим айдишником, но с отрицательным временем
        $ok = setcookie('Profit_Cart['.$id.']',       // имя куки
                        $id,                          // значение
                        time()-60*60*24*30,           // срок хранения
                        '/',                          // путь на сервере
                        '.' . $_SERVER['SERVER_NAME'] // имя сервера
                        );

         // проверяем, есть ли нужные куки
        $cookie = (isset($_COOKIE['Profit_Cart']))
                ? array_merge($_COOKIE['Profit_Cart'])
                : array();
        // удаляем неную запись о куке из массива
        unset($cookie[array_search($id, $cookie)]);

        if($cookie != null)
        {
            // желаемые товары и их картинки
            $cartImages = array();
            $cart = ($cookie != null)
                     ? $this->model->getSomeGoods($cookie)
                     : array();
            $cartImagesData = $this->model->getImages($cart)->toArray();
            foreach($cartImagesData as $image)
            {
                $cartImages[$image['gid']] = $image['file'];
            }
            // посчитаем сколько товаров на сколько денег  в корзине
            $sum = 0;
            $count = 0;
            foreach($cart as $good)
            {
                $sum = $sum + $good->price;
                $count = $count + 1;
            }

            // назначаем в шаблон вида
            $this->view->sum        = $sum;
            $this->view->count      = $count;
            $this->view->cart       = $cart;
            $this->view->cartImages = $cartImages;
        }
        Zend_Layout::getMvcInstance()->disableLayout();
        // перекидываем на страничку товара
        // $this->_redirect($_SERVER['HTTP_REFERER']);
        return true;
	}

/*-----------------------------------------------------------------------------*/

    /**
    * Покупка/заказ товара
    */

    function buyAction()
    {
        // проверяем, есть ли нужные куки
        $cookie = (isset($_COOKIE['Profit_Cart']))
                ? $_COOKIE['Profit_Cart']
                : array();

        // товары и их картинки
        $cartImages = array();
        $cart = ($cookie != null)
                 ? $this->model->getSomeGoods($cookie)
                 : array();
        $cartImagesData = $this->model->getImages($cart)->toArray();
        foreach($cartImagesData as $image)
        {
            $cartImages[$image['gid']] = $image['file'];
        }
        // посчитаем сколько товаров на сколько денег  в корзине
        $sum = 0;
        $count = 0;
        foreach($cart as $good)
        {
            $sum = $sum + $good->price;
            $count = $count + 1;
        }

        // назначаем в шаблон вида
        $this->view->sum        = $sum;
        $this->view->count      = $count;
        $this->view->cart       = $cart;
        $this->view->cartImages = $cartImages;

        // показываем форму
        $form = $this->_form();
        $this->view->form = $form;

        // валидация
        if (!empty($_POST))
        {
            if (!$form->isValid($_POST))
            {
                // показываем сообщение об ошибке
                $this->view->err = 'form_fail';
                // получаем невалидные значения, введенные в форму
                $values = $form->getUnfilteredValues();
                // получаем ошибки
                $errors = $form->getErrors();
                // показываем форму с невалидными данными
                return $this->view->form = $this->_form($values, $errors);
            }
        }

        /**
        * обрабатываем форму
        */

        // если к нам что-то пришло из поста
        if ($this->_request->isPost())
        {
            // получаем корректные данные, введенные юзером
            $values = $form->getValues();
            $this->view->values = $values;

            /**
            * отправляем письмо админу
            */

            // зачитываем конфиг
            $config = $this->_helper->config();
            $this->view->config = $config;
            // инстанцируем Zend_Mail, не забыв указать кодировку
            $mail = new Zend_Mail($config->common->charset);
            // тело сообщения
            $mail->setBodyHtml($this->view->render($this->_scriptPath.'buy_letter.tpl'));
            // имя и адрес отправителя
            $mail->setFrom($config->common->siteMail, $config->common->siteName);
            // имя и адрес получателя
            $mail->addTo( $config->common->adminMail,
                            $this->view->translate('store_cart_buy_letter_to_name')
                            . ' ' . $config->common->siteName);
            // тема письма
            $mail->setSubject( $config->common->siteName . ': ' . $this->view->translate('store_cart_buy_letter_theme'));
            // отправляем
            $mail->send();

            /**
            * Если выставлено в опциях - отправляем письмо юзеру
            */

            if($config->cart_buy_letter == 1 and !empty($values['email']))
            {
                // инстанцируем Zend_Mail, не забыв указать кодировку
                $mail = new Zend_Mail($config->common->charset);
                // тело сообщения
                $mail->setBodyHtml($this->view->render($this->_scriptPath.'buy_letter_user.tpl'));
                // имя и адрес отправителя
                $mail->setFrom($config->common->siteMail, $config->common->siteName);
                // имя и адрес получателя
                $mail->addTo( $values['email'],
                              $values['email']);//
                // тема письма
                $mail->setSubject( $config->common->siteName . ': ' . $this->view->translate('store_cart_buy_letter_theme'));
                // отправляем
                $mail->send();
            }

            /**
            * Очищаем корзину после того, как заказ отправлен
            */

            // устанавливаем куку с этим айдишником, но с отрицательным временем
            foreach($cart as $item)
            {
                $ok = setcookie('Profit_Cart['.$item->id.']', // имя куки
                            $id,                              // значение
                            time()-60*60*24*30,               // срок хранения
                            '/',                              // путь на сервере
                            '.' . $_SERVER['SERVER_NAME']     // имя сервера
                            );
            }

            return $this->view->msg = $this->view->translate('store_cart_buy_ok');
        }


    }

 /*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/

	private function _checkId()
	{
		$id = $this->_getParam('id');

		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return 0;
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

    /**
    * Приватный метод для построения формы заказа/покупки товара
    * В качестве аргумента принимает уже заполненые
    * данные (при редактировании)
    *
    * @param $data array
    * @param $errors array
    * @return object
    */

    private function _form($data   = array(),
                              $errors = array())
    {
        // обратите внимание, форма создается на основе собственного класса.
        $form = new Lord_Form_Form();
        $form->setAction( '/' . $this->_moduleName.
                          '/' . $this->_controllerName.
                          '/buy' )
             ->setMethod('post');

        // кодировка
        $charset = $this->_helper->config()->common->charset;

        // Имя юзернейма, который заказывает товар
        $name = new Lord_Form_Element_Text('name', array(

            'label'       => $this->view->translate('store_cart_form_name'),
            'description' => $this->view->translate('store_cart_form_name_desc'),
            'maxlength'   => '500',
            'validators'  => array(
                array('StringLength', true, array(0, 500, $charset))
            ),
            'value'       => (!empty($data['name'])) ? $data['name'] : ''
        ));
        $form->addElement($name);

        // Телефон юзернейма, который заказывает товар
        $tel = new Lord_Form_Element_Text('tel', array(
            'required'    => true,
            'label'       => $this->view->translate('store_cart_form_tel'),
            'description' => $this->view->translate('store_cart_form_tel_desc'),
            'maxlength'   => '500',
            /*
            'validators'  => array(
                array('Int',          false, array()) ,
                array('StringLength', true,  array(0, 11, $charset))
            ),
            */
            'value'       => (!empty($data['tel'])) ? $data['tel'] : ''
        ));
        $form->addElement($tel);

        // Почта юзернейма, который заказывает товар
        $email = new Lord_Form_Element_Text('email', array(
            'label'       => $this->view->translate('store_cart_form_email'),
            'description' => $this->view->translate('store_cart_form_email_desc'),
            'maxlength'   => '500',
            'validators'  => array(
                array('StringLength', false, array(0, 500, $charset)),
                array('EmailAddress', true,  array()),
            ),
            'value'       => (!empty($data['email'])) ? $data['email'] : ''
        ));
        $form->addElement($email);


        // Комментарии юзера
        // Для отображение редактора нужно поле ввода назвать ckeditor1 или ckeditor2
        // Эти имена можно изменить в /design/js/ckeditor/ckeditor_replace.js
        $sDescription = new Zend_Form_Element_Textarea('s_description', array(
            'label'       => $this->view->translate('store_cart_form_description'),
            'description' => $this->view->translate('store_cart_form_description_desc'),
            'rows'        => '5',
            'cols'        => '50',
            'validators'  => array(
                array('StringLength', true, array(0, 5000, $charset))
             ),
            'filters'     => array('StringTrim'),
            'value'       => (isset($data['s_description']))
                                    ? $data['s_description']
                                    : @$data['s_description']
        ));
        $form->addElement($sDescription);

        // Элемент CAPTCHA, защита от спама
        if($this->_helper->config()->captcha_buy == 1)
        {
            $captcha = new Zend_Form_Element_Captcha('captcha', array(
                'label' => $this->view->translate("store_cart_form_captcha"),
                'captcha' => array(
                    'captcha'   => 'Image', // Тип CAPTCHA
                    'wordLen'   => 4,       // Количество генерируемых символов
                    'width'     => 150,     // Ширина изображения
                    'timeout'   => 120,     // Время жизни сессии хранящей символы
                    'expiration'=> 300,     // Время жизни изображения в файловой системе
                    'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
                    'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
                    'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
                    'gcFreq'    => 5        // Частота вызова сборщика мусора
                ),
            ));
            $form->addElement($captcha);
        }

        // Айдишник кладем в скрытый инпут
        $id = $form->createElement('hidden', 'id')
            ->setValue($this->_checkId());
        $form->addElement($id);
        $cid = $form->createElement('hidden', 'cid')
            ->setValue($this->_checkId());
        $form->addElement($cid);


        // и последним ставим сабмит
        $form->addElement('submit', 'save', array('label' => $this->view->translate('store_cart_form_submit')));

        // ошибки
        $this->_helper->FormErrors($errors, $form);

        return $form;
    }

/*------------------------------------------------------------------------------*/
}
